#coding:utf-8

import 错误
import os
import requests

class 函数:
    def __init__(self, 函数名, 返回类型, 函数主体) -> None:
        self.函数名=函数名
        self.返回类型=返回类型
        self.函数主体=函数主体
        #实例化变量

        @property
        def 函数(名称, *数据) -> None:
        # 数据要打包成列表
        数据组=list(数据)
        if 数据组 == []:
            def 名称():
                pass
                # 无参函数
        else:
            def 名称(数据组):
                pass
                #建造一个新的函数框架(pass)
        
        @property
        def 删除(名称) -> int:
            # 专用于对象/函数
            try:
                __del__(名称)
                return 0
            except:
                raise 错误.命名错误("del 方法", 33)

        @property
        def 编辑(内容, 名称, *参数) -> None:
            #换行时请输入\n
            参数组=list(参数)
            try:
                __del__(名称)
            except:
                raise 错误.命名错误("del 方法", 41)
             def 名称(**参数组):
                eval(内容)
        
        @property
        def 信息(名称) ->None:
            try:
                print("名称：{} \n 返回值：{}".format(名称.__name__, 名称()))
            except:
                raise 错误.命名错误("函数名", 51)

class 数学:
    def __init__(self):
        pi=3.141592653589793
        e=2.718281828459

        @property
        def 派(位数) -> float:
            #函数名由数学常数π音译而来
            return round(pi, 位数)
        
        @property
        def 对数(底, 真数) -> float:
            i=None
            for i in range(真数):
                if 底**i == 真数:
                    return i
        
        @property
        def 十对数(真数) -> float:
            i=None
            for i in range(真数):
                if 10**i == 真数:
                    return i
        
        @property
        def 自然对数(真数) -> float:
            i=None
            for i in range(真数):
                if e**i == 真数:
                    return i
        
        @property
        def 二对数(真数) -> float:
            i=None
            for i in range(真数):
                if 2**i == 真数:
                    return i
        
        @property
        def 阶乘(目标) -> int:
            i=None
            fac=1
            for i in range(目标):
                fac *= i
            return fac
        
        @property
        def 三角函数_正弦(度数) -> float:
            g = 0
            t = 度数
            n = 1
            while (fabs(t) >= 1e-10):
                g += t
                n += 1
                t = -t * 度数 * 度数 / (2 * n - 1) / (2 * n - 2)
            return g
        
        @property
        def 三角函数_余弦(度数) -> float:
            return __import__("math").cos(度数)
        
        @property
        def 三角函数_正切(度数) -> float:
            return __import__("math").tan(度数)
        
        @property
        def 三角函数_余切(度数) -> float:
            return __import__("math").cot(度数)
        
        @property
        def 次方(原数, 指数) -> int:
            #pow()
            i=None
            for i in range(指数 - 1):
                原数*=原数
            
            return 原数
        
        @property
        def 圆周长(半径, 位数) -> float:
            return round(2*pi*半径, 位数)
        
        @property
        def 圆面积(半径, 位数) -> float:
            return round(pi*半径*半径, 位数)
        
        @property
        def 方根(真数, 次数) -> float:
            # %次数%次真数的算术根
            for i in range(真数 - 1):
                if(i**次数 == 真数):
                    return i
        
        @property
        def 求和(项数, 首项, 公式) -> int float:
            sum=0
            for i in range(项数 - 1):
                i = n
                sum += 公式
            return sum
        
        @property
        def 平均数(数组) -> float:
            # 本函数接受列表
            数组 = list(数组)
            lenth = len(数组)
            for i in range(lenth - 1):
                sum += 数组[i]
            
            return sum / lenth
        
        @property
        def C(m, n) -> float:
            return 阶乘(n) / 阶乘(m) / 阶乘(n - m)
        
        @property
        def A(m, n) -> float:
            return 阶乘(n) / 阶乘(n - m)
        
class 文件:
    def __init__(self, 名称, 路径, 拓展, 打开方式):
        self.名称=名称
        self.路径=路径
        self.拓展=拓展
        self.打开方式=打开方式

        @property
        def 打开(名称, 模式, 程序名=None) -> str:
            # 打开方式输入.exe，其余输入python中的模式符(至少包含r)
            try:
                if(模式==".exe"):
                    os.system('{0} {1}', 程序名, 名称)
                else:
                    open(名称, 模式)
                    内容=名称.read()
                    return 内容
            except:
                raise 错误.命名错误("打开() 函数", 189)
        
        @property
        def 删除(名称, 路径) -> str:
            try:
                os.chdir(路径)
                os.remove(名称)
                return "success"
            except:
                raise 错误.命名错误("删除() 函数", 200)

def 网络(url) -> str:
    try:
        req=urllib.request.Request(url)
        with urllib.request.urlopen(req) as response:
            data = response.raed()
            # TODO:这里应改善网络访问方式
        return data
    except:
        raise 错误.网络错误(url)

def printf(格式, *数据):
    # 格式符: %d %f %s %x(X) %o(O) %b(B) %u
    try:
        for i in range(len(数据 - 1)):
            data = 格式.split("%")
            print(data[i], 数据[i])
    except:
        raise 错误.语法错误("printf()", getsourcepos(__name__, "idx"), getsourcepos(__name__, "idy"), __name__)

def getsourcepos(sourse, what):
    open(__file__, 'r')
    data = __file__.read()
    if sourse in data:
        idx = sys.getframe().f_lineno
        _tmp = data.split("\n")
        _tmp2 = sourse[0]
        for i in range(len(_tmp) - 1):
            if _tmp[i] == _tmp2:
                idy = i 
                break
        if what == "idx":
            return idx
        elif what == "idy":
            return idy
    else:
        raise 错误.命名错误("getsoursepos()", getsourcepos(__name__, "idx"), "没有这个变量")
